home *** CD-ROM | disk | FTP | other *** search
/ Developer Helper 1: Phil & Dave's Excellent CD / Excellent CD HFS.raw / Moof / Goodies / HyperCard Goodies / HyperCard Dev. ToolKit / Serial & MacinTalk XCMDs / GetCreator.a < prev    next >
Text File  |  1987-07-04  |  5KB  |  259 lines

  1.  
  2. ;
  3. ;  WildLaunch.a,  assembly language support for Launch
  4. ;
  5.  
  6.  
  7.     BLANKS    ON
  8.     STRING    PASCAL
  9.  
  10.     PRINT    OFF
  11.     INCLUDE    'FSEqu.a'
  12.     INCLUDE    'FSPrivate.a'
  13.     INCLUDE    'SysEqu.a'
  14.     INCLUDE    'ToolEqu.a'
  15.     INCLUDE    'Traps.a'
  16.     PRINT    ON
  17.  
  18. Debug    EQU    1    ; Set to 1 for debugging code, 0 for none
  19.  
  20.     MACRO
  21. &Label    NewProc    &PType=ENTRY,&Size=0,&Bug='None'
  22. &Label    PROC    &PType
  23.     GBLA    &ProcDB
  24.     GBLC    &ProcName
  25. &ProcDB    SETA    0
  26.     IF    Debug>0|&UPCASE(&Bug)='DEBUG' THEN
  27. &ProcDB    SETA    2
  28. &ProcName    SETC    &CONCAT(&UPCASE(&Label),'        ')
  29.     ELSEIF    &Size<>0 THEN
  30. &ProcDB    SETA    1
  31.     ENDIF
  32.     IF    &ProcDB<>0 THEN
  33.     LCLA    &Sz
  34. &Sz    SETA    0-&ABS(&Size)
  35.     LINK    A6,#&Sz
  36.     ENDIF
  37.     ENDM
  38.  
  39.     MACRO
  40.     ProcExit    &Size=0
  41.     GBLA    &ProcDB
  42.     GBLC    &ProcName
  43.     IF    &ProcDB>0 THEN
  44.     UNLK    A6
  45.     ENDIF
  46.     IF    &Size<>0 THEN
  47.     LCLA    &Sz
  48. &Sz    SETA    &ABS(&Size)
  49.     MOVE.L    (SP),&Sz(SP)
  50.     ADD.L    #&Sz,SP
  51.     ENDIF
  52.     RTS
  53.     IF    &ProcDB=2 THEN
  54.     LCLC    &StrSet
  55. &StrSet    SETC    &SETTING('STRING')
  56.     STRING    ASIS
  57.     DC.B    '&ProcName[1:8]'
  58.     STRING    &StrSet
  59.     ENDIF
  60.     ENDM
  61.  
  62.     MACRO
  63.     XIT    &Where
  64.     GBLA    &ProcDB
  65.     IF    &ProcDB>0 THEN
  66.     BRA.S    &Where
  67.     ELSE
  68.     RTS
  69.     ENDIF
  70.     ENDM
  71.  
  72.  
  73.  
  74. ScanOneDeskTop NewProc
  75. ;----------------------------------------------------------------
  76. ;
  77. ;  Scan the desktop file of the specified volume looking for an 
  78. ;  application creator.  If the volume is offline, return false
  79. ;  immediately.
  80. ;
  81. ;
  82. ;    On entry:
  83. ;        D3 = creator to locate
  84. ;        A2 = pointer to volume VCB
  85. ;        A3 = address of area for short filename 
  86. ;    
  87. ;    On exit:
  88. ;        D0 = 0 if not found, non-zero if found
  89. ;        D1 = directory in which found or zero
  90.  
  91. DTApplRec    RECORD    0,INCR
  92. dtCreator    DS.L    1
  93. dtDir    DS.L    1
  94. dtFilName    DS.B    66
  95.     ENDR
  96.  
  97.     WITH    DTApplRec
  98.  
  99.     MOVEM.L    D4/A2-A4,-(SP)    ; Save registers
  100.  
  101.     CMP    #TSigWord,vcbSigWord(A2) ; Is this an HFS volume?
  102.     BNE    @9        ; No, no point in continuing
  103.  
  104.     TST    vcbDrvNum(A2)    ; Is the volume off-line?
  105.     BEQ    @9        ; Branch to exit if so
  106.  
  107.     CLR    -(SP)        ; Disable SetResLoad to
  108.     _SetResLoad        ; prevent un-necessary preloads
  109.  
  110.     CLR    -(SP)        ; Open the desktop file
  111.     PEA    #'DeskTop'
  112.     MOVE    vcbVRefNum(A2),-(SP)
  113.     MOVE.B    #fsRdPerm,-(SP)
  114.     _OpenRFPerm
  115.  
  116.     MOVE    (SP)+,D4        ; Save the returned value
  117.  
  118.     MOVE    #-1,-(SP)        ; Enable SetResLoad
  119.     _SetResLoad
  120.  
  121.     CMP    #-1,D4        ; Was there an open error?
  122.     BNE.S    @1        ; Branch onwards if no error
  123.  
  124.     MOVEQ    #0,D0        ; Return false
  125.     MOVEQ    #0,D1
  126.     BRA.S    @9        ; and exit
  127.  
  128. @1    CLR.L    -(SP)        ; Get list of APPLs on volume
  129.     MOVE.L    #'APPL',-(SP)
  130.     CLR    -(SP)
  131.     _GetResource
  132.  
  133.     MOVE.L    (SP)+,D0        ; Get returned handle to data
  134.     BEQ.S    @8        ; Exit if NIL
  135.  
  136.     MOVE.L    D0,A2        ; Save starting point of search
  137.     MOVE.L    (A2),A2
  138.  
  139.     CLR.L    -(SP)        ; Get size of APPL data
  140.     MOVE.L    D0,-(SP)
  141.     _SizeRsrc
  142.  
  143.     MOVE.L    A2,A4        ; Create ending point of search
  144.     ADD.L    (SP)+,A4
  145.  
  146. @2    CMP.L    #'APPL',D3    ; Searching for filename?
  147.     BNE.S    @3        ; Branch if not
  148.  
  149.     MOVEQ    #0,D0        ; Compare filenames
  150.     MOVE.L    A3,A0
  151.     MOVE.B    (A0)+,D0
  152.     SWAP    D0
  153.     LEA    dtFilName(A2),A1
  154.     MOVE.B    (A1)+,D0
  155.     _CmpString
  156.  
  157.     BNE.S    @4        ; If not equal, get next entry
  158.  
  159.     MOVE.L    dtDir(A2),D1    ; Get directory in which found
  160.     MOVEQ    #1,D0        ; Mark as found
  161.     BRA.S    @8
  162.  
  163. @3    CMP.L    dtCreator(A2),D3    ; Compare creators
  164.     BNE.S    @4        ; If not equal, get next entry
  165.  
  166.     LEA    dtFilName(A2),A0    ; Copy filename
  167.     MOVE.L    A3,A1
  168.     MOVEQ    #1,D0
  169.     ADD.B    (A0),D0
  170.     _BlockMove
  171.  
  172.     MOVE.L    dtDir(A2),D1    ; Get directory in which found    
  173.     MOVEQ    #1,D0        ; Mark as found
  174.     BRA.S    @8
  175.  
  176. @4    MOVEQ    #10,D0        ; Move to next entry
  177.     ADD.B    dtFilName(A2),D0
  178.     BCLR    #0,D0
  179.     ADD    D0,A2
  180.  
  181.     CMP    A2,A4        ; At end of APPL list?
  182.     BLO.S    @2        ; Yes, branch back to test next one
  183.  
  184.     MOVEQ    #0,D0        ; Clear result fields
  185.     MOVEQ    #0,D1
  186.  
  187. @8    MOVEM.L    D0-D1,-(SP)    ; Save results
  188.  
  189.     MOVE    D4,-(SP)        ; Close the desktop file
  190.     _CloseResFile
  191.  
  192.     MOVEM.L    (SP)+,D0-D1    ; Restore results
  193.  
  194. @9    TST    D0        ; Set success/fail flag
  195.     MOVEM.L    (SP)+,D4/A2-A4    ; Restore registers
  196.     ProcExit
  197.  
  198.  
  199.  
  200. ScanDeskTop NewProc EXPORT,2
  201. ;----------------------------------------------------------------
  202. ;
  203. ;  FUNCTION  ScanDeskTop(creator: ResType; VAR appVol: INTEGER; 
  204. ;                VAR appDir: LongInt; VAR appName: Str255): BOOLEAN;    EXTERNAL;
  205. ;
  206. ;  Scan the desktop file of every on-line volume starting with
  207. ;  the default volume, then in VCB order.
  208.  
  209. StkFrame    RECORD    {A6Link},DECR
  210. Result    DS.W    1
  211. Creator    DS.L    1
  212. appVolPtr    DS.L    1
  213. appDirPtr    DS.L    1
  214. appNamPtr    DS.L    1
  215. Return    DS.L    1
  216. A6Link    DS.L    1
  217. DefVol    DS.W    1
  218.     ENDR
  219.  
  220.     WITH    StkFrame
  221.  
  222.     MOVEM.L    D0-D7/A0-A4,-(SP)    ; Save the registers
  223.     CLR    Result(A6)    ; Set result false
  224.  
  225.     MOVE.L    Creator(A6),D3    ; Search default volume
  226.     MOVE.L    DefVCBPtr,A2
  227.     MOVE.L    appNamPtr(A6),A3
  228.     JSR    ScanOneDeskTop
  229.     BNE.S    @3        ; If found, just to exit routine
  230.  
  231.     MOVE.L    DefVCBPtr,D4    ; Get default (already searched)
  232.     MOVE.L    VCBQHdr+2,D0    ; Search volumes in turn
  233.     BRA.S    @2
  234.  
  235. @1    MOVE.L    (A2),D0        ; Get next VCB pointer
  236.     BEQ.S    @4        ; Exit if end of list
  237.  
  238. @2    MOVE.L    D0,A2        ; Move it to somewhere useful
  239.     CMP.L    D0,D4        ; Is it the default volume?
  240.     BEQ.S    @1        ; Ignore if so, already searched
  241.  
  242.     JSR    ScanOneDeskTop    ; Search this volume
  243.     BEQ.S    @1        ; If not found, search next volume
  244.  
  245. @3    MOVE.L    appVolPtr(A6),A0    ; Store vRefNum
  246.     MOVE    vcbVRefNum(A2),(A0)
  247.  
  248.     MOVE.L    appDirPtr(A6),A0    ; Store directory number
  249.     MOVE.L    D1,(A0)
  250.  
  251.     MOVE    #$0100,Result(A6)    ; Set function true
  252.  
  253. @4    MOVEM.L    (SP)+,D0-D7/A0-A4    ; Restore the registers
  254.     ProcExit    16
  255.  
  256.  
  257.  
  258.     END
  259.